<?php
/**
 * @copyright: ©2024 永州 微聚商网络科技有限公司
 * @link: https://www.wEijuyunke.com
 */
namespace app\api\controller;

use think\facade\Db;
use think\facade\Env;
use app\admin\model\SystemConfig;
use app\admin\service\TriggerService;
use think\facade\Cache;

class Curl
{

    public function index()
    {
        $protocol = (! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $domainName = $_SERVER['HTTP_HOST'];

        $data2 = array(
            "rjbs" => "consume",
            "yuming" => $protocol . $domainName,
            "version" => sysconfig("site", "site_version")
        );

        $appid = sysconfig("site", "site_appid");

        $result = $this->master_api("http://c5.weijuyunke.com/api/SoftwareApi/software", $data2, $appid);
        $jsonData = json_decode($result, true);

        if ($jsonData['code'] === 200) {
            $filePath = $jsonData["data"]["renew_catalogue"];
            // 定义打包文件夹，没有就创建
            $needZipPath = './tempzip/';
            if (! is_dir($needZipPath)) {
                @mkdir($needZipPath, 0755);
            }
            // 根据斜杆分割,获取最后一个值(zip的名称)
            // $filename = substr($filePath, strrpos($filePath, '/') + 1);

            $filename = app()->getRootPath() . "public/tempzip/" . basename($filePath);

            // 从服务器下载zip包
            $this->curl_download($filePath, $filename);
            $zip = new \ZipArchive();
            // 打开一个zip
            $res = $zip->open($filename);

            $upload_url = app()->getRootPath();
            if ($res === TRUE) {

                $files = array();

                for ($i = 0; $i < $zip->numFiles; $i ++) {
                    $file = $zip->getNameIndex($i);
                    if ($file != 'config/database.php' && $file != 'public/.user.ini' && $file != 'config/redis.php') {
                        $files[] = $file;
                    }
                }

                // 解压到指定目录
                $zip->extractTo($upload_url, $files);
                $zip->close();

                if (file_exists($filename)) {
                    unlink($filename);
                }

                // 在文件中写入新的版本号
                // $write_res = file_put_contents($url, "1.0.2"); */

                // 修改为自己的路径
                $_sqlFile = app()->getRootPath() . 'config/upgrade/sql/upgrade.php';
                if (is_file($_sqlFile)) {
                    require_once (app()->getRootPath() . "config/upgrade/sql/upgrade.php");
                }

                $version = $jsonData["data"]["version_number"];

                SystemConfig::where("name", "site_version")->update([
                    'value' => $version
                ]);

                Cache::clear();

                echo json_encode([
                    "code" => 0,
                    "message" => '更新成功',
                    "data" => []
                ]);
            } else {

                echo json_encode([
                    "code" => 1,
                    "message" => '解压失败' . $filename,
                    "data" => []
                ]);
            }
            @rmdir($needZipPath);
        } else {

            echo json_encode([
                "code" => 1,
                "message" => $jsonData['msg'],
                "data" => []
            ]);
        }
    }

    public function version()
    {
        $appid = sysconfig("site", "site_appid");

        if ($appid) {

            $data2 = array(
                "rjbs" => "consume",
                "appid" => $appid
            );

            $appid = $appid;

            $result = $this->master_api("http://c5.weijuyunke.com/api/SoftwareApi/versionLog", $data2, $appid);

            $jsonData = json_decode($result, true);

            if ($jsonData['code'] === 200) {
                return $jsonData['data'];
            } else {
                return [];
            }
        } else {
            return [];
        }
    }

    function master_api($uri, $data, $appid)
    {
        $request = 'post'; // 接口请求方式 (get/post)

        $data['appid'] = $appid;

        $key = "wjyk1411182200"; // 提供的接口ACCESS_KEY

        $data['sign'] = $this->createMasterApiSign($uri, $data, $key); // 生成动态签名sign

        $url = $uri . '?appid=' . $appid . '&sign=' . $data['sign'] . ''; // 调用接口 $uri接口名

        $result = $this->$request($url, $data);
        return $result;
    }

    /**
     * 生成签名结果
     *
     * $uri 调用接口方法的url
     *
     * $data 接口接收到的数组
     *
     * $accesskey 提供的接口ACCESS_KEY
     */
    function createMasterApiSign($uri, $data, $accesskey)
    {
        /* 数组排序 */
        ksort($data);
        reset($data);
        $arg = $this->createQueryString($data);
        $sign = md5($uri . '&' . $arg . $accesskey);
        return $sign;
    }

    function createQueryString($data)
    {
        $arg = "";
        foreach ($data as $key => $value) {
            $arg .= $key . "=" . $value . "&";
        }
        $arg = substr($arg, 0, - 1); // 去掉最后一个&字符
        return $arg;
    }

    function get($url, $data = '', $cookie = '')
    {
        if ($data)
            $url = $url . '?' . $this->createQueryString($data);

        $curl = curl_init($url);
        // 不显示header信息
        curl_setopt($curl, CURLOPT_HEADER, 0);
        // 将 curl_exec()获取的信息以文件流的形式返回，而不是直接输出。
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        // 使用自动跳转
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
        if (! empty($cookie)) {
            // 包含cookie数据的文件名，cookie文件的格式可以是Netscape格式，或者只是纯HTTP头部信息存入文件。
            curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);
        }
        // 自动设置Referer
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
        $result = curl_exec($curl);
        // 推断curl请求是否超时
        if (curl_errno($curl)) {
            $result = file_get_contents($url);
        }
        curl_close($curl);
        return $result;
    }

    function post($url, $params, $cookie = '')
    {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        // 对认证证书来源的检查，0表示阻止对证书的合法性的检查。
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        // 从证书中检查SSL加密算法是否存在
        // curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
        // 模拟用户使用的浏览器，在HTTP请求中包含一个”user-agent”头的字符串。
        curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        // 发送一个常规的POST请求，类型为：application/x-www-form-urlencoded，就像表单提交的一样。
        curl_setopt($curl, CURLOPT_POST, 1);
        // 将 curl_exec()获取的信息以文件流的形式返回，而不是直接输出。
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        // 使用自动跳转
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
        // 自动设置Referer
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
        // Cookie地址
        curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);
        // 全部数据使用HTTP协议中的"POST"操作来发送。要发送文件，
        // 在文件名前面加上@前缀并使用完整路径。这个参数可以通过urlencoded后的字符串
        // 类似'para1=val1¶2=val2&...'或使用一个以字段名为键值，字段数据为值的数组
        // 如果value是一个数组，Content-Type头将会被设置成multipart/form-data。
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));
        $result = curl_exec($curl);
        // 推断curl请求是否超时
        if (curl_errno($curl)) {
            $result = file_get_contents($url);
        }
        curl_close($curl);
        return $result;
    }

    function curl_download($url, $dir)
    {
        $ch = curl_init($url);
        $fp = fopen($dir, "wb");
        curl_setopt($ch, CURLOPT_FILE, $fp);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $res = curl_exec($ch);
        curl_close($ch);
        fclose($fp);
        return $res;
    }

    /**
     * 获取文件内容
     *
     * @param $url 要获取的url
     * @return res 成功返回内容 失败返回false
     */
    public function get_file($url)
    {
        if (trim($url) == '') {
            return false;
        }
        $opts = array(
            'http' => array(
                'method' => "GET",
                'timeout' => 3
            )
        ); // 单位秒

        $cnt = 0;
        while ($cnt < 3 && ($res = @file_get_contents($url, false, stream_context_create($opts))) === FALSE)
            $cnt ++;
        if ($res === false) {
            return false;
        } else {
            return $res;
        }
    }
}